﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Entity.Infrastructure;
using QuanLyHocPhi.Model;
using System.Data.Entity;

namespace QuanLyHocPhi.BLL
{
    /// <summary>
    /// Lớp xử lý nghiệp vụ liên quan đến sinh viên
    /// </summary>
    partial class BizSinhVien
    {
        internal static void AddNew_SinhVienKhongChuyen(QLHPEntities context, SinhVien sinhVien)
        {
            try
            {
                // Kiểm tra sự trùng lặp MaSinhVien
                SinhVien oSinhVien = (from sv in context.SinhVienDbSet
                                      where sv.MaSinhVien == sinhVien.MaSinhVien
                                      select sv).FirstOrDefault();
                if (oSinhVien != null)
                    throw new Exception(
                        string.Format("Mã sinh viên đã tồn tại!\n\t1) {0} - {1}\n\t{2} - {3}",
                        sinhVien.MaSinhVien, sinhVien.HoDem + " " + sinhVien.Ten,
                        oSinhVien.MaSinhVien, oSinhVien.HoDem + " " + oSinhVien.Ten));
                context.SinhVienDbSet.Add(sinhVien);
                context.SaveChanges();
            }
            catch (Exception exc)
            {
                throw exc.InnerException;
            }
        }

        /// <summary>
        /// Lấy sinh viên theo mã sinh viên
        /// </summary>
        /// <param name="maSinhVien"></param>
        /// <returns></returns>
        internal static SinhVien GetSinhVienByMaSinhVien(string maSinhVien)
        {
            using (var context = new QLHPEntities())
            {
                var sinhVien = context.SinhVienDbSet.Include(e => e.Lop.Truong).SingleOrDefault(e => e.MaSinhVien.Equals(maSinhVien));
                return sinhVien;
            }

        }
        internal static List<SinhVien> GetSinhVienByKeyWord(string keyWord)
        {
            using (var context = new QLHPEntities())
            {
                var list = (from e in context.SinhVienDbSet
                            where
                            (e.MaSinhVien.Contains(keyWord) ||
                             e.HoDem.Contains(keyWord) ||
                             e.Ten.Contains(keyWord) ||
                             (e.HoDem + " " + e.Ten).Contains(keyWord)
                            )
                            select e).Take(100);
                return list.ToList();
            }
        }
        internal static List<LopHocPhan_SinhVien> GetLopHocPhan_SinhVien(string maSinhVien)
        {
            using (var context = new QLHPEntities())
            {
                var list = from e in context.LopHocPhan_SinhVienDbSet
                           where e.MaSinhVien.Equals(maSinhVien)
                           orderby e.LopHocPhan.HocKy.NamHoc, e.LopHocPhan.HocKy.SoHieuHocKy ascending
                           select e;
                //context.LopHocPhan_SinhVienDbSet.Where(e => e.MaSinhVien.Equals(maSinhVien)).OrderBy(e => e.LopHocPhan.HocKy.SoHieuHocKy).OrderBy(e => e.LopHocPhan.HocKy.NamHoc);
                return list.ToList();
            }
        }
        internal static LopHocPhanChuyenNganh_SinhVien GetLopHPCN_SinhVien(string maSinhVien, string maLopHPCN)
        {
            using (var context = new QLHPEntities())
            {
                var lop = context.LopHocPhanChuyenNganh_SinhVienDbSet.Include(e => e.SinhVien).Include(e => e.LopHocPhanChuyenNganh).Where(e => e.MaSinhVien.Equals(maSinhVien) && e.MaLopHocPhanChuyenNganh.Equals(maLopHPCN)).FirstOrDefault();
                return lop;
            }
        }
        internal static LopHocPhan_SinhVien GetLopHocPhan_SinhVien(string maSinhVien, string maLopHocPhan)
        {
            using (var context = new QLHPEntities())
            {
                var lopHP_SV = context.LopHocPhan_SinhVienDbSet.Include(e => e.SinhVien).Include(e => e.LopHocPhan).Include(e => e.LopHocPhan.HocKy).Where(e => e.MaSinhVien.Equals(maSinhVien) && e.MaLopHocPhan.Equals(maLopHocPhan)).FirstOrDefault();
                return lopHP_SV;
            }
        }
        //internal static LopChuyenNganh_SinhVien GetLopChuyenNganh_SinhVien(string maSinhVien, string maLopChuyenNganh)
        //{
        //    using (var context = new QLHPEntities())
        //    {
        //        var lopCN_SV = context.LopChuyenNganh_SinhVien.Where(e => e.MaSinhVien.Equals(maSinhVien) && e.MaLopChuyenNganh.Equals(maLopChuyenNganh)).FirstOrDefault();
        //        return lopCN_SV;
        //    }
        //}

        internal static List<SinhVien> GetListSinhVienKhongChuyen(string namHoc, int hocKy, string maTruong, bool daNop)
        {
            using (var context = new QLHPEntities())
            {
                var listmaLopHP = from e in context.LopHocPhanDbSet
                                  where e.HocKy.NamHoc == namHoc && e.HocKy.SoHieuHocKy == hocKy
                                  select e.MaLopHocPhan;
                var listMaSV = from e in context.LopHocPhan_SinhVienDbSet
                               where listmaLopHP.Contains(e.MaLopHocPhan) && (daNop == false ? string.IsNullOrEmpty(e.MaPhieuThu) : true)
                               select e.MaSinhVien;
                var list = context.SinhVienDbSet.Where(e => e.Lop.Truong.MaTruong == maTruong &&
                                                    listMaSV.Contains(e.MaSinhVien) &&
                                                    e.MaLoai == (int)LoaiSinhVien.SinhVienKhongChuyen
                                                    ).OrderBy(e => e.HoDem).OrderBy(e => e.Ten).OrderBy(e => e.Lop.TenLop).Include(t => t.LopHocPhan_SinhVienCollection).Include(t => t.Lop);
                return list.ToList();
            }
        }

        internal static List<SinhVien> GetListSinhVienChuyen(string namHoc, int hocKy, string maChuyenNganh, bool daNop)
        {
            using (var context = new QLHPEntities())
            {
                var listmaLopCN = from e in context.LopHocPhanChuyenNganhDbSet
                                  where e.HocKy.NamHoc == namHoc && e.HocKy.SoHieuHocKy == hocKy && e.LopChuyenNganh.MaChuyenNganh == maChuyenNganh
                                  select e.MaLopChuyenNganh;
                var listMaSV = from e in context.LopHocPhanChuyenNganh_SinhVienDbSet
                               where listmaLopCN.Contains(e.MaLopHocPhanChuyenNganh) && (daNop == false ? string.IsNullOrEmpty(e.MaPhieuThu) : true)
                               select e.MaSinhVien;
                var list = context.SinhVienDbSet.Where(e => listMaSV.Contains(e.MaSinhVien) &&
                            e.MaLoai == (int)LoaiSinhVien.SinhVienChuyenNganh
                                                    ).OrderBy(e => e.HoDem).OrderBy(e => e.Ten).Include(t => t.LopHocPhanChuyenNganh_SinhVienCollection);
                return list.ToList();
            }
        }

        /// <summary>
        /// Lấy danh sách sinh viên chuyên ngành {maNganh}, tuyển sinh năm {namTuyenSinh}
        /// </summary>
        /// <param name="maNganh"></param>
        /// <param name="namTuyenSinh"></param>
        /// <returns></returns>
        internal static IList<SinhVien> GetListSinhVienChuyen(string maNganh, int namTuyenSinh)
        {
            using (var context = new QLHPEntities())
            {
                //var query = from sv in context.SinhVienDbSet
                //            where sv.MaLoai == SinhVien.MaLoai_Chuyen &&
                //            sv.C_MaNganh == maNganh &&
                //            sv.C_NamTuyenSinh == namTuyenSinh
                //            orderby sv.Ten, sv.HoDem
                //            select sv;
                //return query.ToList().ToSortableBindingList();
                return null;
            }
        }

        /// <summary>
        /// Xoá sinh viên khỏi hệ thống
        /// </summary>
        /// <param name="pSinhVien"></param>
        internal static void Delete_SinhVien(SinhVien pSinhVien)
        {
            using (var context = new QLHPEntities())
            {
                pSinhVien = context.SinhVienDbSet
                    .Where(sv => sv.MaSinhVien == pSinhVien.MaSinhVien)
                    .FirstOrDefault();
                if (pSinhVien == null)
                    throw new Exception("Không tồn tại sinh viên trong hệ thống");

                try
                {
                    context.SinhVienDbSet.Remove(pSinhVien);
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    string msg = string.Format("Không thể xoá sinh viên {0} khỏi hệ thống!\nChi tiết lỗi:\n ",
                        pSinhVien.HoVaTen) + exc.InnerException.Message;
                    throw new Exception(msg);
                }
            }
        }

        internal static void AddNew_SinhVienKhongChuyen(SinhVien sv)
        {
            using (var context = new QLHPEntities())
            {
                try
                {
                    context.SinhVienDbSet.Add(sv);
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể bổ sung sinh viên", exc);
                }
            }
        }

        internal static void Edit_SinhVienKhongChuyen(SinhVien sv)
        {
            using (var context = new QLHPEntities())
            {
                try
                {
                    SinhVien oSinhVien = context.SinhVienDbSet.Where(e => e.MaLoai == sv.MaLoai &&
                        e.MaSinhVien == sv.MaSinhVien).FirstOrDefault();
                    if (oSinhVien == null)
                        throw new Exception("Sinh viên " + sv.HoVaTen + " không còn tồn tại trên hệ thống!");
                    oSinhVien.HoDem = sv.HoDem;
                    oSinhVien.Ten = sv.Ten;
                    oSinhVien.NgaySinh = sv.NgaySinh;
                    oSinhVien.HeSoMienGiam = sv.HeSoMienGiam;
                    oSinhVien.KC_MaLop = sv.KC_MaLop;
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể cập nhật thông tin sinh viên", exc);
                }
            }
        }

        /// <summary>
        /// Khong cap nhat he so mien giam
        /// </summary>
        /// <param name="sv"></param>
        /// <param name="notHeSoMienGiam"></param>
        internal static void Edit_SinhVienKhongChuyen(SinhVien sv, bool notHeSoMienGiam)
        {
            using (var context = new QLHPEntities())
            {
                try
                {
                    SinhVien oSinhVien = context.SinhVienDbSet.Where(e => e.MaLoai == SinhVien.MaLoai_KhongChuyen &&
                        e.MaSinhVien == sv.MaSinhVien).FirstOrDefault();
                    if (oSinhVien == null)
                        throw new Exception("Sinh viên " + sv.HoVaTen + " không còn tồn tại trên hệ thống!");
                    oSinhVien.HoDem = sv.HoDem;
                    oSinhVien.Ten = sv.Ten;
                    oSinhVien.NgaySinh = sv.NgaySinh;
                    //oSinhVien.HeSoMienGiam = sv.HeSoMienGiam;
                    oSinhVien.KC_MaLop = sv.KC_MaLop;
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể cập nhật thông tin sinh viên", exc);
                }
            }
        }
        /// <summary>
        /// Lấy danh sách sinh viên thuộc lớp chuyên ngành
        /// </summary>
        /// <param name="maLopChuyenNganh"></param>
        /// <returns></returns>
        internal static IList<SinhVien> GetListSinhVienChuyen(string maLopChuyenNganh)
        {
            using (var context = new QLHPEntities())
            {
                var lstSinhVien = context.SinhVienDbSet.
                    Where(e =>
                        e.C_MaLopChuyenNganh == maLopChuyenNganh &&
                        e.MaLoai == SinhVien.MaLoai_Chuyen).ToList().ToSortableBindingList();
                return lstSinhVien;
            }
        }

        /// <summary>
        /// Lấy danh sách sinh viên của một trường theo khóa tuyển sinh
        /// </summary>
        /// <param name="maTruong"></param>
        /// <param name="namTuyenSinh"></param>
        /// <returns></returns>
        internal static List<SinhVien> GetListSinhVienKhongChuyen(string maTruong, int namTuyenSinh)
        {
            using (var context = new QLHPEntities())
            {
                return context.SinhVienDbSet.Include(e => e.LopHocPhan_SinhVienCollection).Where(e => e.Lop.MaTruong == maTruong && e.Lop.NamTuyenSinh == namTuyenSinh).OrderBy(e => e.KC_MaLop).ToList();
            }
        }
        /// <summary>
        /// Lấy danh sách các lớp học phần của một sinh viên đã đăng ký theo học, kèm theo thông tin lớp học phần, học kỳ
        /// </summary>
        /// <param name="maSinhVien"></param>
        /// <returns></returns>
        internal static List<LopHocPhan_SinhVien> GetListLopHP_SV(string maSinhVien)
        {
            using (var context = new QLHPEntities())
            {
                var list = from t in context.LopHocPhan_SinhVienDbSet.Include("LopHocPhan").Include("LopHocPhan.HocKy")
                           orderby t.LopHocPhan.HocKy.NamHoc, t.LopHocPhan.HocKy.SoHieuHocKy ascending
                           where t.MaSinhVien == maSinhVien
                           select t;
                return list.ToList(); //context.LopHocPhan_SinhVienDbSet.Include(e => e.LopHocPhan).Include(e => e.LopHocPhan.HocKy).Where(e => e.MaSinhVien == maSinhVien).OrderBy(e => e.LopHocPhan.HocKy.NamHoc).OrderBy(e => e.LopHocPhan.HocKy.SoHieuHocKy).ToList();
            }
        }
        /// <summary>
        /// Mới thêm vào
        /// </summary>
        /// <returns></returns>
        internal static List<LopHocPhan_SinhVien> GetListLopHP_SV()
        {
            using (var context = new QLHPEntities())
            {
                var list = from t in context.LopHocPhan_SinhVienDbSet.Include("LopHocPhan").Include("LopHocPhan.HocKy")
                           select t;
                return list.ToList();
            }
        }

        private static void WriteLog(System.IO.StreamWriter sw, string log)
        {
            sw.WriteLine(log);
        }

        private static void WriteLog(System.IO.StreamWriter sw, string logFormat, params object[] args)
        {
            sw.WriteLine(string.Format(logFormat, args));
        }

        /// <summary>
        /// Nạp dữ liệu SinhVien, LopGoc, LopHocPhan, PhieuThu từ DataTable
        /// </summary>
        /// <param name="dt"></param>
        internal static void NapDuLieuSinhVienKhongChuyen(
            string nguoiTaoPhieuThu,
            Truong truong,
            HocKy hocKy,
            int namTuyenSinh,
            bool phuThu,
            DataTable dt,
            string logFile = null)
        {
            var context = new QLHPEntities();
            #region System.IO.StreamWriter sw = mở file log nếu được
            System.IO.StreamWriter sw = null;
            try
            {
                sw = new System.IO.StreamWriter(logFile);
            }
            catch
            {
                logFile = null;
            }
            #endregion

            try
            {
                string st = string.Format("--Nạp dữ liệu - trường {0}, sinh viên khoá tuyển sinh {1}, học kỳ {2} năm học {3}",
                    truong.TenTruong, namTuyenSinh, hocKy.SoHieuHocKy, hocKy.NamHoc);
                WriteLog(sw, st);
                WriteLog(sw, StringUtils.TạoChuỗi('-', st.Length));
                WriteLog(sw, "--01. Nạp danh sách các lớp gốc ({0})", DateTime.Now);
                #region 01. Phase 1 - Nạp danh sách các lớp gốc
                List<string> lstLopGoc = new List<string>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string tenLopGoc = Convert.ToString(dt.Rows[i][Col_TenLopGoc]);
                    if (tenLopGoc.IsNullOrEmpty())
                        continue;
                    tenLopGoc = tenLopGoc.Trim();
                    if (lstLopGoc.Contains(tenLopGoc) == false)
                        lstLopGoc.Add(tenLopGoc);
                }

                for (int i = 0; i < lstLopGoc.Count; i++)
                {
                    string tenLopGoc = lstLopGoc[i];
                    var oLopGoc = context.LopDbSet
                        .Where(e => e.TenLop.Contains(tenLopGoc)
                        //&&e.MaTruong == truong.MaTruong
                            )
                        .FirstOrDefault();
                    if (oLopGoc == null)
                    {
                        // Lớp gốc chưa tồn tại → Tạo lớp gốc
                        var lopGoc = new Lop
                        {
                            MaLop = Guid.NewGuid().ToString(),
                            TenLop = tenLopGoc,
                            MaTruong = truong.MaTruong,
                            NamTuyenSinh = namTuyenSinh
                        };
                        try
                        {
                            context.LopDbSet.Add(lopGoc);
                            context.SaveChanges();
                            WriteLog(sw, "+LopGoc+{1}\tTạo lớp gốc {0}", tenLopGoc, lopGoc.MaLop);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("\tLỗi khi tạo lớp gốc {0}", tenLopGoc);
                            WriteLog(sw, msg);
                            throw new Exception(msg, exc);
                        }
                    }
                }
                #endregion

                WriteLog(sw, "--02. Tạo các lớp học phần ({0})", DateTime.Now);
                #region 02. Phase 2 - Đăng ký thông tin lớp học phần
                // Lấy danh sách tên lớp học phần
                List<string> lstLopHocPhan = new List<string>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string tenNhom = Convert.ToString(dt.Rows[i][Col_TenLopHocPhan]);
                    if (tenNhom.IsNullOrEmpty())
                        continue;
                    string tenLopHocPhan = string.Format("{0}-{1}-{2}", tenNhom.Trim(), truong.MaTruong, namTuyenSinh);
                    //string tenLopHocPhan = string.Format("{0} ({1})",
                    //  tenNhom.Trim(), truong.MaTruong).Trim();
                    if (lstLopHocPhan.Contains(tenLopHocPhan) == false)
                        lstLopHocPhan.Add(tenLopHocPhan);
                }

                // Tạo các lớp học phần
                foreach (string tenLopHocPhan in lstLopHocPhan)
                {
                    //string tenLopHocPhan = string.Format("{0}-{1}-{2}", tenLop, truong.MaTruong, namTuyenSinh);
                    int countLopHocPhan = (from lopHocPhan in context.LopHocPhanDbSet
                                           where lopHocPhan.TenLopHocPhan == tenLopHocPhan &&
                                           lopHocPhan.MaHocKy == hocKy.MaHocKy
                                           select lopHocPhan).Count();
                    if (countLopHocPhan != 0)
                        continue;
                    LopHocPhan oLopHocPhan = new LopHocPhan
                    {
                        MaLopHocPhan = Guid.NewGuid().ToString(),
                        TenLopHocPhan = tenLopHocPhan,
                        MaHocKy = hocKy.MaHocKy,
                        HocPhi = hocKy.HocPhiKhongChuyen,
                        MaTruong = truong.MaTruong
                    };
                    #region oLopHocPhan.HocPhi = chỉnh sửa lại theo dữ liệu trong dt

                    decimal hocPhi = hocKy.HocPhiKhongChuyen;

                    if (hocPhi != 0)
                        oLopHocPhan.HocPhi = hocPhi;
                    if (phuThu)
                        oLopHocPhan.PhuThu = hocKy.PhuThuKhongChuyen;
                    #endregion
                    try
                    {
                        context.LopHocPhanDbSet.Add(oLopHocPhan);
                        context.SaveChanges();
                        WriteLog(sw, "+LopHocPhan+{1}\tTạo lớp học phần {0}", tenLopHocPhan, oLopHocPhan.MaLopHocPhan);
                    }
                    catch (Exception exc)
                    {
                        string msg = string.Format("\tLỗi khi tạo lớp học phần {0}", tenLopHocPhan);
                        WriteLog(sw, msg);
                        throw new Exception(msg, exc);
                    }
                }
                #endregion

                WriteLog(sw, "--03. Đăng ký dữ liệu sinh viên ({0})", DateTime.Now);
                #region 03. Phase 3 - Đăng ký thông tin sinh viên
                long phieuThuSo = 1;
                long quyenSo = 1;
                var cauHinh = BizNguoiSuDung.GetNguoiSuDung("cauhinh");
                if (cauHinh != null)
                {
                    var thongtin = cauHinh.MatKhau.Split(new string[] { ";" }, StringSplitOptions.None);
                    if (thongtin.Length == 2)
                    {
                        long result = 0;
                        if (long.TryParse(thongtin[0], out result))
                        {
                            quyenSo = long.Parse(thongtin[0]);
                            if (long.TryParse(thongtin[1], out result))
                                phieuThuSo = long.Parse(thongtin[1]);
                        }
                    }
                }
                Dictionary<string, string> dictTenLopGoc_MaLopGoc = new Dictionary<string, string>();
                Dictionary<string, string> dictTenLopHocPhan_MaLopHocPHan = new Dictionary<string, string>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow row = dt.Rows[i];
                    string maSinhVien = Convert.ToString(row[Col_MaSinhVien]);
                    if (maSinhVien.IsNullOrEmpty())
                        continue;
                    maSinhVien = maSinhVien.Trim();
                    #region double heSoMienGiam;
                    double heSoMienGiam = 0;
                    try
                    {
                        if (row[Col_HeSoMienGiam] != DBNull.Value)
                            heSoMienGiam = Convert.ToDouble(row[Col_HeSoMienGiam]);
                    }
                    catch
                    {
                        heSoMienGiam = 0;
                    }
                    #endregion
                    string tenLopGoc = Convert.ToString(row[Col_TenLopGoc]);
                    string tenNhom = Convert.ToString(dt.Rows[i][Col_TenLopHocPhan]);
                    if (tenNhom.IsNullOrEmpty())
                        continue;
                    string tenLopHocPhan = string.Format("{0}-{1}-{2}", tenNhom.Trim(), truong.MaTruong, namTuyenSinh);
                    int countSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == maSinhVien).Count();
                    if (countSinhVien == 0)
                    {
                        //Dũng moved
                        if (tenLopGoc.IsNullOrEmpty())
                            continue;

                        #region Nạp sinh viên vào hệ thống
                        #region string maLopGoc = mã lớp gốc tương ứng với tenLopGoc
                        string maLopGoc = null;
                        if (dictTenLopGoc_MaLopGoc.ContainsKey(tenLopGoc))
                            maLopGoc = dictTenLopGoc_MaLopGoc[tenLopGoc];
                        else
                        {
                            maLopGoc = (from lopgoc in context.LopDbSet
                                        where lopgoc.TenLop == tenLopGoc &&
                                        lopgoc.MaTruong == truong.MaTruong
                                        select lopgoc.MaLop).FirstOrDefault();
                            if (maLopGoc.IsNullOrEmpty())
                            {
                                //throw new Exception("Không xác định được MaLopGoc tương ứng với tên lớp = " + tenLopGoc);
                                //Thêm mới lớp gốc
                                Lop lop = new Lop()
                                   {
                                       MaLop = Guid.NewGuid().ToString(),
                                       TenLop = tenLopGoc,
                                       NamTuyenSinh = namTuyenSinh,
                                       MaTruong = truong.MaTruong
                                   };
                                BizTruong.Add_LopKhongChuyen(lop);
                                maLopGoc = lop.MaLop;
                            }
                            dictTenLopGoc_MaLopGoc.Add(tenLopGoc, maLopGoc);
                        }
                        #endregion
                        string hoDem = Convert.ToString(row[Col_HoDem]);
                        #region string ten;
                        string ten = "";
                        try
                        {
                            ten = Convert.ToString(row[Col_Ten]);
                        }
                        catch { ten = ""; }
                        #endregion
                        #region string ngaySinh;
                        string ngaySinh = "";
                        try
                        {
                            ngaySinh = Convert.ToString(row[Col_NgaySinh]);
                        }
                        catch
                        {
                            ngaySinh = "";
                        }
                        #endregion
                        SinhVien oSinhVien = new SinhVien
                        {
                            MaSinhVien = maSinhVien,
                            MaLoai = SinhVien.MaLoai_KhongChuyen,
                            KC_MaLop = maLopGoc,
                            HoDem = hoDem,
                            Ten = ten,
                            NgaySinh = ngaySinh,
                            HeSoMienGiam = heSoMienGiam
                        };
                        try
                        {
                            context.SinhVienDbSet.Add(oSinhVien);
                            context.SaveChanges();
                            WriteLog(sw, "+SinhVien+{0}\tTạo record sinh viên {1} vào lớp {2}", maSinhVien, hoDem + " " + ten, tenLopGoc);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("\tLỗi khi tạo record sinh viên {0}-{1} vào lớp {2}", maSinhVien, hoDem + " " + ten, tenLopGoc);
                            WriteLog(sw, msg);
                            throw new Exception(msg, exc);
                        }
                        #endregion
                    }

                    #region Biên chế sinh viên vào lớp học phần
                    #region string maLopHocPhan = mã lớp học phần tương ứng với tênLớpHocPhan;
                    string maLopHocPhan = null;
                    if (dictTenLopHocPhan_MaLopHocPHan.ContainsKey(tenLopHocPhan))
                        maLopHocPhan = dictTenLopHocPhan_MaLopHocPHan[tenLopHocPhan];
                    else
                    {
                        maLopHocPhan = (from lhp in context.LopHocPhanDbSet
                                        where lhp.TenLopHocPhan == tenLopHocPhan &&
                                        lhp.MaHocKy == hocKy.MaHocKy
                                        select lhp.MaLopHocPhan).FirstOrDefault();
                        if (maLopHocPhan.IsNullOrEmpty())
                            continue;
                        dictTenLopHocPhan_MaLopHocPHan.Add(tenLopHocPhan, maLopHocPhan);
                    }
                    #endregion

                    #region decimal soTien = số tiền;
                    decimal soTien = 0;
                    try
                    {
                        if (row[Col_SoTien] != DBNull.Value)
                        {
                            //string stSoTien = Convert.ToString(row[Col_SoTien]);
                            //stSoTien = stSoTien.Replace(",", "").Replace(".", "");
                            //soTien = Convert.ToDecimal(stSoTien);
                            soTien = Convert.ToDecimal(row[Col_SoTien]);
                        }
                    }
                    catch
                    {
                        soTien = 0;
                    }
                    #endregion
                    string maPhieuThu = null;
                    if (soTien > 0 && heSoMienGiam < 1)
                    {
                        int countPhieuThu = context.PhieuThuDbSet
                            .Where(e => e.MaSinhVien == maSinhVien
                            && e.KC_MaLopHocPhan == maLopHocPhan).Count();
                        // && e.SoTien == soTien
                        if (countPhieuThu == 0)
                        {
                            #region Tạo thông tin phiếu thu
                            try
                            {
                                maPhieuThu = Guid.NewGuid().ToString();
                                PhieuThu phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = maPhieuThu,
                                    KC_MaLopHocPhan = maLopHocPhan,
                                    MaSinhVien = maSinhVien,
                                    NgayThu = DateTime.Now.Date,
                                    TenDangNhap = nguoiTaoPhieuThu,
                                    SoTien = soTien,
                                    NoiDungThu = "Thu học phí",
                                    QuyenSo = quyenSo.ToString(),
                                    SoPhieuThu = phieuThuSo.ToString()
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                context.SaveChanges();
                                if (phieuThuSo % 50 == 0)
                                    quyenSo += 1;
                                phieuThuSo += 1;
                                WriteLog(sw, "+PhieuThu+{4}\tTạo phiếu thu cho sinh viên {0} ứng với lớp {1}: Số tiền: {2}, HSMG: {3}, Số phiếu: {5}, Quyển số {6}",
                                    maSinhVien, tenLopHocPhan, soTien, heSoMienGiam, phieuThu.MaPhieuThu, phieuThu.SoPhieuThu, phieuThu.QuyenSo);
                            }
                            catch (Exception exc)
                            {
                                string msg = string.Format("Lỗi khi tạo phiếu thu cho sinh viên {0} ứng với lớp {1}: Số tiền: {2}, HSMG: {3}",
                                    maSinhVien, tenLopHocPhan, soTien, heSoMienGiam);
                                WriteLog(sw, "\t" + msg);
                                throw new Exception(msg, exc);
                            }
                            #endregion
                        }
                    }

                    // Xử lý biên chế sv vào lớp học phần
                    int countThongTinDangKy = (from ttdk in context.LopHocPhan_SinhVienDbSet
                                               where ttdk.MaSinhVien == maSinhVien &&
                                               ttdk.MaLopHocPhan == maLopHocPhan
                                               select ttdk).Count();
                    if (countThongTinDangKy == 0)
                    {
                        #region Biên chế sv vào lớp học phần
                        try
                        {
                            LopHocPhan_SinhVien oThongTinDangKy = new LopHocPhan_SinhVien
                                {
                                    MaSinhVien = maSinhVien,
                                    MaLopHocPhan = maLopHocPhan,
                                    HeSoMienGiam = heSoMienGiam,
                                    MaPhieuThu = maPhieuThu
                                };
                            context.LopHocPhan_SinhVienDbSet.Add(oThongTinDangKy);
                            context.SaveChanges();
                            WriteLog(sw, "+LopHocPhan_SinhVien+{0}+{2}\tBiên chế vào lớp học phần {1}", maSinhVien, tenLopHocPhan, maLopHocPhan);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("Lỗi khi biên chế sinh viên {0} vào lớp học phần {1}", maSinhVien, tenLopHocPhan);
                            WriteLog(sw, "\t" + msg);
                            throw new Exception(msg, exc);
                        }
                        #endregion
                    }
                    #endregion
                }
                if (cauHinh != null)
                    BizNguoiSuDung.DoiMatKhau(cauHinh, quyenSo.ToString() + ";" + phieuThuSo.ToString());
                #endregion

                #region 04. Phase 4 - Xoá các lớp gốc bị bổ sung "thừa" trong phase 1
                WriteLog(sw, "--04. Xoá những lớp gốc bị thừa (nếu có) - thường xảy ra khi chọn nhầm trường hoặc tên lớp của sv bị sai so với lần import trước đó!");
                foreach (string tenLopGoc in lstLopGoc)
                {
                    Lop lopGoc = (from e in context.LopDbSet
                                  where e.TenLop == tenLopGoc
                                  select e).FirstOrDefault();
                    if (lopGoc == null)
                        continue;
                    int countSinhVien = (from sv in context.SinhVienDbSet
                                         where sv.KC_MaLop == lopGoc.MaLop
                                         select sv.HoDem).Count();
                    if (countSinhVien == 0)
                    {
                        try
                        {
                            context.LopDbSet.Remove(lopGoc);
                            context.SaveChanges();
                            WriteLog(sw, "\tXoá lớp gốc {0}", lopGoc.TenLop);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("tLỗi khi xoá lớp gốc {0}", lopGoc.TenLop);
                            WriteLog(sw, "\t" + msg);
                            throw new Exception(msg, exc);
                        }
                    }
                }
                #endregion
            }
            catch (Exception exc)
            {
                throw exc;
            }
            finally
            {
                if (sw != null)
                    sw.Close();
                context.Dispose();
            }
        }

        /// <summary>
        /// Nạp dữ liệu SinhVien, LopGoc, LopHocPhan, PhieuThu từ DataTable
        /// </summary>
        /// <param name="dt"></param>
        internal static void NapDuLieuSinhVienChuyen(
            string nguoiTaoPhieuThu,
            Truong truong,
            HocKy hocKy,
            int namTuyenSinh,
            bool phuThu,
            DataTable dt,
            string logFile = null)
        {
            var context = new QLHPEntities();
            #region System.IO.StreamWriter sw = mở file log nếu được
            System.IO.StreamWriter sw = null;
            try
            {
                sw = new System.IO.StreamWriter(logFile);
            }
            catch
            {
                logFile = null;
            }
            #endregion

            try
            {
                string st = string.Format("--Nạp dữ liệu - trường {0}, sinh viên khoá tuyển sinh {1}, học kỳ {2} năm học {3}",
                    truong.TenTruong, namTuyenSinh, hocKy.SoHieuHocKy, hocKy.NamHoc);
                WriteLog(sw, st);
                WriteLog(sw, StringUtils.TạoChuỗi('-', st.Length));
                WriteLog(sw, "--01. Nạp danh sách các lớp gốc ({0})", DateTime.Now);
                #region 01. Phase 1 - Nạp danh sách các lớp gốc
                List<string> lstLopGoc = new List<string>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string tenLopGoc = Convert.ToString(dt.Rows[i][Col_TenLopGoc]);
                    if (tenLopGoc.IsNullOrEmpty())
                        continue;
                    tenLopGoc = tenLopGoc.Trim();
                    if (lstLopGoc.Contains(tenLopGoc) == false)
                        lstLopGoc.Add(tenLopGoc);
                }

                for (int i = 0; i < lstLopGoc.Count; i++)
                {
                    string tenLopGoc = lstLopGoc[i];
                    var oLopGoc = context.LopDbSet
                        .Where(e => e.TenLop == tenLopGoc
                        //&&e.MaTruong == truong.MaTruong
                            )
                        .FirstOrDefault();
                    if (oLopGoc == null)
                    {
                        // Lớp gốc chưa tồn tại → Tạo lớp gốc
                        var lopGoc = new Lop
                        {
                            MaLop = Guid.NewGuid().ToString(),
                            TenLop = tenLopGoc,
                            MaTruong = truong.MaTruong,
                            NamTuyenSinh = namTuyenSinh
                        };
                        try
                        {
                            context.LopDbSet.Add(lopGoc);
                            context.SaveChanges();
                            WriteLog(sw, "+LopGoc+{1}\tTạo lớp gốc {0}", tenLopGoc, lopGoc.MaLop);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("\tLỗi khi tạo lớp gốc {0}", tenLopGoc);
                            WriteLog(sw, msg);
                            throw new Exception(msg, exc);
                        }
                    }
                }
                #endregion

                WriteLog(sw, "--02. Tạo các lớp học phần ({0})", DateTime.Now);
                #region 02. Phase 2 - Đăng ký thông tin lớp học phần
                // Lấy danh sách tên lớp học phần
                List<string> lstLopHocPhan = new List<string>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string tenNhom = Convert.ToString(dt.Rows[i][Col_TenLopHocPhan]);
                    if (tenNhom.IsNullOrEmpty())
                        continue;
                    string tenLopHocPhan = string.Format("{0} ({1})",
                        tenNhom.Trim(), truong.MaTruong).Trim();
                    if (lstLopHocPhan.Contains(tenLopHocPhan) == false)
                        lstLopHocPhan.Add(tenLopHocPhan);
                }

                // Tạo các lớp học phần
                foreach (string tenLopHocPhan in lstLopHocPhan)
                {
                    int countLopHocPhan = (from lopHocPhan in context.LopHocPhanDbSet
                                           where lopHocPhan.TenLopHocPhan == tenLopHocPhan &&
                                           lopHocPhan.MaHocKy == hocKy.MaHocKy
                                           select lopHocPhan).Count();
                    if (countLopHocPhan != 0)
                        continue;
                    LopHocPhan oLopHocPhan = new LopHocPhan
                    {
                        MaLopHocPhan = Guid.NewGuid().ToString(),
                        TenLopHocPhan = tenLopHocPhan,
                        MaHocKy = hocKy.MaHocKy,
                        HocPhi = hocKy.HocPhiChuyen,
                        MaTruong = truong.MaTruong
                    };
                    #region oLopHocPhan.HocPhi = chỉnh sửa lại theo dữ liệu trong dt

                    decimal hocPhi = hocKy.HocPhiChuyen;




                    if (hocPhi != 0)
                        oLopHocPhan.HocPhi = hocPhi;
                    //Dũng Fix
                    if (phuThu)
                        oLopHocPhan.PhuThu = hocKy.PhuThuChuyen;
                    #endregion
                    try
                    {
                        context.LopHocPhanDbSet.Add(oLopHocPhan);
                        context.SaveChanges();
                        WriteLog(sw, "+LopHocPhan+{1}\tTạo lớp học phần {0}", tenLopHocPhan, oLopHocPhan.MaLopHocPhan);
                    }
                    catch (Exception exc)
                    {
                        string msg = string.Format("\tLỗi khi tạo lớp học phần {0}", tenLopHocPhan);
                        WriteLog(sw, msg);
                        throw new Exception(msg, exc);
                    }
                }
                #endregion

                WriteLog(sw, "--03. Đăng ký dữ liệu sinh viên ({0})", DateTime.Now);
                #region 03. Phase 3 - Đăng ký thông tin sinh viên
                long phieuThuSo = 1;
                long quyenSo = 1;
                var cauHinh = BizNguoiSuDung.GetNguoiSuDung("cauhinh");
                if (cauHinh != null)
                {
                    var thongtin = cauHinh.MatKhau.Split(new string[] { ";" }, StringSplitOptions.None);
                    if (thongtin.Length == 2)
                    {
                        long result = 0;
                        if (long.TryParse(thongtin[0], out result))
                        {
                            quyenSo = long.Parse(thongtin[0]);
                            if (long.TryParse(thongtin[1], out result))
                                phieuThuSo = long.Parse(thongtin[1]);
                        }
                    }
                }
                Dictionary<string, string> dictTenLopGoc_MaLopGoc = new Dictionary<string, string>();
                Dictionary<string, string> dictTenLopHocPhan_MaLopHocPHan = new Dictionary<string, string>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow row = dt.Rows[i];
                    string maSinhVien = Convert.ToString(row[Col_MaSinhVien]);
                    if (maSinhVien.IsNullOrEmpty())
                        continue;
                    #region double heSoMienGiam;
                    double heSoMienGiam = 0;
                    try
                    {
                        if (row[Col_HeSoMienGiam] != DBNull.Value)
                            heSoMienGiam = Convert.ToDouble(row[Col_HeSoMienGiam]);
                    }
                    catch
                    {
                        heSoMienGiam = 0;
                    }
                    #endregion
                    string tenLopGoc = Convert.ToString(row[Col_TenLopGoc]);
                    //Dũng removed
                    string tenNhom = Convert.ToString(dt.Rows[i][Col_TenLopHocPhan]);
                    if (tenNhom.IsNullOrEmpty())
                        continue;
                    string tenLopHocPhan = string.Format("{0} ({1})",
                        tenNhom.Trim(), truong.MaTruong).Trim();

                    int countSinhVien = context.SinhVienDbSet.Where(e => e.MaSinhVien == maSinhVien).Count();
                    if (countSinhVien == 0)
                    {
                        //Dũng moved
                        if (tenLopGoc.IsNullOrEmpty())
                            continue;

                        #region Nạp sinh viên vào hệ thống
                        #region string maLopGoc = mã lớp gốc tương ứng với tenLopGoc
                        string maLopGoc = null;
                        if (dictTenLopGoc_MaLopGoc.ContainsKey(tenLopGoc))
                            maLopGoc = dictTenLopGoc_MaLopGoc[tenLopGoc];
                        else
                        {
                            maLopGoc = (from lopgoc in context.LopDbSet
                                        where lopgoc.TenLop == tenLopGoc &&
                                        lopgoc.MaTruong == truong.MaTruong
                                        select lopgoc.MaLop).FirstOrDefault();
                            if (maLopGoc.IsNullOrEmpty())
                                throw new Exception("Không xác định được MãLớpGốc tương ứng với tên lớp = " + tenLopGoc);
                            dictTenLopGoc_MaLopGoc.Add(tenLopGoc, maLopGoc);
                        }
                        #endregion
                        string hoDem = Convert.ToString(row[Col_HoDem]);
                        #region string ten;
                        string ten = "";
                        try
                        {
                            ten = Convert.ToString(row[Col_Ten]);
                        }
                        catch { ten = ""; }
                        #endregion
                        #region string ngaySinh;
                        string ngaySinh = "";
                        try
                        {
                            ngaySinh = Convert.ToString(row[Col_NgaySinh]);
                        }
                        catch
                        {
                            ngaySinh = "";
                        }
                        #endregion
                        SinhVien oSinhVien = new SinhVien
                        {
                            MaSinhVien = maSinhVien,
                            MaLoai = SinhVien.MaLoai_Chuyen,
                            KC_MaLop = maLopGoc,
                            HoDem = hoDem,
                            Ten = ten,
                            NgaySinh = ngaySinh,
                            HeSoMienGiam = heSoMienGiam
                        };
                        try
                        {
                            context.SinhVienDbSet.Add(oSinhVien);
                            context.SaveChanges();
                            WriteLog(sw, "+SinhVien+{0}\tTạo record sinh viên {1} vào lớp {2}", maSinhVien, hoDem + " " + ten, tenLopGoc);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("\tLỗi khi tạo record sinh viên {0}-{1} vào lớp {2}", maSinhVien, hoDem + " " + ten, tenLopGoc);
                            WriteLog(sw, msg);
                            throw new Exception(msg, exc);
                        }
                        #endregion
                    }

                    #region Biên chế sinh viên vào lớp học phần
                    #region string maLopHocPhan = mã lớp học phần tương ứng với tênLớpHocPhan;
                    string maLopHocPhan = null;
                    if (dictTenLopHocPhan_MaLopHocPHan.ContainsKey(tenLopHocPhan))
                        maLopHocPhan = dictTenLopHocPhan_MaLopHocPHan[tenLopHocPhan];
                    else
                    {
                        maLopHocPhan = (from lhp in context.LopHocPhanDbSet
                                        where lhp.TenLopHocPhan == tenLopHocPhan &&
                                        lhp.MaHocKy == hocKy.MaHocKy
                                        select lhp.MaLopHocPhan).FirstOrDefault();
                        if (maLopHocPhan.IsNullOrEmpty())
                            continue;
                        dictTenLopHocPhan_MaLopHocPHan.Add(tenLopHocPhan, maLopHocPhan);
                    }
                    #endregion

                    #region decimal soTien = số tiền;
                    decimal soTien = 0;
                    try
                    {
                        if (row[Col_SoTien] != DBNull.Value)
                        {
                            //string stSoTien = Convert.ToString(row[Col_SoTien]);
                            //stSoTien = stSoTien.Replace(",", "").Replace(".", "");
                            //soTien = Convert.ToDecimal(stSoTien);
                            soTien = Convert.ToDecimal(row[Col_SoTien]);
                        }
                    }
                    catch
                    {
                        soTien = 0;
                    }
                    #endregion
                    string maPhieuThu = null;
                    if (soTien > 0 && heSoMienGiam < 1)
                    {
                        int countPhieuThu = context.PhieuThuDbSet
                            .Where(e => e.MaSinhVien == maSinhVien
                            && e.KC_MaLopHocPhan == maLopHocPhan
                            && e.SoTien == soTien).Count();
                        if (countPhieuThu == 0)
                        {
                            #region Tạo thông tin phiếu thu
                            try
                            {
                                maPhieuThu = Guid.NewGuid().ToString();
                                PhieuThu phieuThu = new PhieuThu
                                {
                                    MaPhieuThu = maPhieuThu,
                                    KC_MaLopHocPhan = maLopHocPhan,
                                    MaSinhVien = maSinhVien,
                                    NgayThu = DateTime.Now.Date,
                                    TenDangNhap = nguoiTaoPhieuThu,
                                    SoTien = soTien,
                                    NoiDungThu = "Thu học phí",
                                    QuyenSo = quyenSo.ToString(),
                                    SoPhieuThu = phieuThuSo.ToString()
                                };
                                context.PhieuThuDbSet.Add(phieuThu);
                                context.SaveChanges();
                                if (phieuThuSo % 50 == 0)
                                    quyenSo += 1;
                                phieuThuSo += 1;
                                WriteLog(sw, "+PhieuThu+{4}\tTạo phiếu thu cho sinh viên {0} ứng với lớp {1}: Số tiền: {2}, HSMG: {3}, Số phiếu: {5}, Quyển số {6}",
                                    maSinhVien, tenLopHocPhan, soTien, heSoMienGiam, phieuThu.MaPhieuThu, phieuThu.SoPhieuThu, phieuThu.QuyenSo);
                            }
                            catch (Exception exc)
                            {
                                string msg = string.Format("Lỗi khi tạo phiếu thu cho sinh viên {0} ứng với lớp {1}: Số tiền: {2}, HSMG: {3}",
                                    maSinhVien, tenLopHocPhan, soTien, heSoMienGiam);
                                WriteLog(sw, "\t" + msg);
                                throw new Exception(msg, exc);
                            }
                            #endregion
                        }
                    }

                    // Xử lý biên chế sv vào lớp học phần
                    int countThongTinDangKy = (from ttdk in context.LopHocPhan_SinhVienDbSet
                                               where ttdk.MaSinhVien == maSinhVien &&
                                               ttdk.MaLopHocPhan == maLopHocPhan
                                               select ttdk).Count();
                    if (countThongTinDangKy == 0)
                    {
                        #region Biên chế sv vào lớp học phần
                        try
                        {
                            LopHocPhan_SinhVien oThongTinDangKy = new LopHocPhan_SinhVien
                            {
                                MaSinhVien = maSinhVien,
                                MaLopHocPhan = maLopHocPhan,
                                HeSoMienGiam = heSoMienGiam,
                                MaPhieuThu = maPhieuThu
                            };
                            context.LopHocPhan_SinhVienDbSet.Add(oThongTinDangKy);
                            context.SaveChanges();
                            WriteLog(sw, "+LopHocPhan_SinhVien+{0}+{2}\tBiên chế vào lớp học phần {1}", maSinhVien, tenLopHocPhan, maLopHocPhan);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("Lỗi khi biên chế sinh viên {0} vào lớp học phần {1}", maSinhVien, tenLopHocPhan);
                            WriteLog(sw, "\t" + msg);
                            throw new Exception(msg, exc);
                        }
                        #endregion
                    }
                    #endregion
                }
                if (cauHinh != null)
                    BizNguoiSuDung.DoiMatKhau(cauHinh, quyenSo.ToString() + ";" + phieuThuSo.ToString());
                #endregion

                #region 04. Phase 4 - Xoá các lớp gốc bị bổ sung "thừa" trong phase 1
                WriteLog(sw, "--04. Xoá những lớp gốc bị thừa (nếu có) - thường xảy ra khi chọn nhầm trường hoặc tên lớp của sv bị sai so với lần import trước đó!");
                foreach (string tenLopGoc in lstLopGoc)
                {
                    Lop lopGoc = (from e in context.LopDbSet
                                  where e.TenLop == tenLopGoc
                                  select e).FirstOrDefault();
                    if (lopGoc == null)
                        continue;
                    int countSinhVien = (from sv in context.SinhVienDbSet
                                         where sv.KC_MaLop == lopGoc.MaLop
                                         select sv.HoDem).Count();
                    if (countSinhVien == 0)
                    {
                        try
                        {
                            context.LopDbSet.Remove(lopGoc);
                            context.SaveChanges();
                            WriteLog(sw, "\tXoá lớp gốc {0}", lopGoc.TenLop);
                        }
                        catch (Exception exc)
                        {
                            string msg = string.Format("tLỗi khi xoá lớp gốc {0}", lopGoc.TenLop);
                            WriteLog(sw, "\t" + msg);
                            throw new Exception(msg, exc);
                        }
                    }
                }
                #endregion
            }
            catch (Exception exc)
            {
                throw exc;
            }
            finally
            {
                if (sw != null)
                    sw.Close();
                context.Dispose();
            }
        }


        internal static string UndoNapDuLieuSinhVienKhongChuyen(string logfile)
        {
            System.IO.StreamReader sr = null;
            var context = new QLHPEntities();
            try
            {
                #region Đọc và phân tích các task
                sr = new System.IO.StreamReader(logfile);
                List<string> lstTask = new List<string>();
                while (true)
                {
                    string line = sr.ReadLine();
                    if (line == null)
                        break;
                    if (line.StartsWith("+") == false)
                        continue;
                    int idxTab = line.IndexOf("\t");
                    if (idxTab <= 0)
                        continue;
                    line = line.Substring(1, idxTab - 1);
                    if (line.Length > 0)
                        lstTask.Add(line);
                }
                #endregion

                #region Thực hiện undo các task
                List<string> lstUndo = new List<string>();
                int nUndo_OK = 0;
                for (int i = lstTask.Count - 1; i >= 0; i--)
                {
                    string task = lstTask[i];
                    string[] param = task.Split('+');
                    if (param.Length == 0)
                        continue;
                    string stCommand = "";
                    if (param[0] == "LopHocPhan_SinhVien")
                    {
                        #region Xoá biên chế lớp học phần
                        string maSinhVien = param[1];
                        string maLopHocPhan = param[2];
                        stCommand = string.Format("delete from LopHocPhan_SinhVien where MaSinhVien='{0}' and MaLopHocPhan='{1}'", maSinhVien, maLopHocPhan);
                        #endregion
                    }
                    else if (param[0] == "PhieuThu")
                    {
                        #region Xoá phiếu thu
                        string maPhieuThu = param[1];
                        stCommand = string.Format("delete from PhieuThu where MaPhieuThu='{0}'", maPhieuThu);
                        #endregion
                    }
                    else if (param[0] == "LopHocPhan")
                    {
                        #region Xoá lớp học phần
                        string maLopHocPhan = param[1];
                        stCommand = string.Format("delete from LopHocPhan where MaLopHocPhan = '{0}'", maLopHocPhan);
                        #endregion
                    }
                    else if (param[0] == "LopGoc")
                    {
                        #region Xoá lớp gốc
                        stCommand = string.Format("delete from Lop where MaLop='{0}'", param[1]);
                        #endregion
                    }
                    else if (param[0] == "SinhVien")
                    {
                        #region Xoá sinh viên
                        stCommand = string.Format("delete from SinhVien where MaSinhVien='{0}'", param[1]);
                        #endregion
                    }
                    try
                    {
                        int nEffected = context.Database.ExecuteSqlCommand(stCommand);
                        if (nEffected > 0)
                        {
                            lstUndo.Add(string.Format("-{0}", task));
                            nUndo_OK++;
                        }
                        else
                            lstUndo.Add(string.Format("~{0}", task));
                    }
                    catch (Exception exc)
                    {
                        lstUndo.Add(string.Format("!{0}!{1}!{2}", task, stCommand, exc.Message));
                    }
                }
                #endregion

                #region Ghi file undo task
                //System.IO.FileInfo fi = new System.IO.FileInfo(logfile);
                //string undologfile = string.Format("{0}\\{1}.undo.{2}.log", 
                //    fi.DirectoryName, fi.Name, DateTime.Now.ToString("yyyyMMdd-hhmmss"));
                string undologfile = string.Format("{0}_{1}.undo",
                    System.IO.Path.GetFileNameWithoutExtension(logfile),
                    DateTime.Now.ToString("yyyyMMdd-hhmmss"));
                System.IO.StreamWriter sw = new System.IO.StreamWriter(undologfile);
                for (int i = lstUndo.Count - 1; i >= 0; i--)
                    sw.WriteLine(lstUndo[i]);
                sw.Close();
                return string.Format("Khôi phục được {0}/{1} thao tác! Xem chi tiết tại file {2}", nUndo_OK, lstTask.Count, undologfile);
                #endregion
            }
            catch (Exception exc)
            {
                return "Lỗi " + exc.Message;
            }
            finally
            {
                if (sr != null)
                    sr.Close();
                context.Dispose();
            }
        }

        internal static List<SinhVien> GetListSinhVienKhongChuyen(string maLop)
        {
            using (var context = new QLHPEntities())
            {
                return context.SinhVienDbSet.Where(e => e.KC_MaLop == maLop).ToList();
            }
        }
    }

    public enum LoaiSinhVien
    {
        SinhVienKhongChuyen = 0,
        SinhVienChuyenNganh = 1
    }
}
